/**
 * 根据传入的时间，计算距离创建时间距离自动取消的时间差
 * @param {String} createTime 传入的时间，可以是时间戳或者时间字符串
 * @param {String | Number} _cancelTime 取消时间，传入的时间为毫秒数，默认为24小时后的毫秒数
 * @return {Number} 返回距离订单创建时间24小时后自动取消的时间差，单位为毫秒
 * @example
 * formatCountDown('2021-08-01 12:00:00') // 86400000
 * formatCountDown(1627849600000) // 86400000
 * formatCountDown(1627849600000, 10000) // 10000
 */

function formatCountDown(createTime, _cancelTime) {
  // 假设订单在24小时后自动取消
  const cancelTime = _cancelTime || 24 * 60 * 60 * 1000;
  // 将createTime转换为毫秒（如果createTime是秒级时间戳）
  const createTimeInMs = new Date(createTime).getTime();
  // 计算当前时间与订单创建时间加上24小时后的差值
  const now = new Date().getTime();
  const timeDiff = createTimeInMs + cancelTime - now;
  // 返回剩余的毫秒数，如果已经过了取消时间则返回0
  return timeDiff > 0 ? timeDiff : 0;
}

/**
 * 格式化时间戳为指定格式的字符串
 * @param {number|string|Date} timestamp - 时间戳（毫秒）、日期字符串或 Date 对象
 * @param {string} [format='YYYY-MM-DD HH:mm:ss'] - 格式模板
 * @param {string} [timezone] - 目标时区（如 'Asia/Shanghai'），默认使用本地时区
 * @example
 * formatDate(new Date()) // 2023-06-15 14:30:45
 * formatDate(1686829845000, 'YYYY/MM/DD HH:mm') // 2023/06/15 14:30
 * formatDate('2023-06-15T06:30:45Z', 'YYYY年MM月DD日 hh:mm:ss A') // 2023年06月15日 02:30:45 下午
 * formatDate(new Date(), 'YYYY-MM-DD HH:mm:ss.SSS Z') // 2023-06-15 14:30:45.123 +0800
 * formatDate(new Date(), 'YYYY-MM-DD HH:mm:ss', 'America/New_York') // 使用纽约时区格式化
 * @returns {string} 格式化后的时间字符串
 *
 * 支持的格式占位符：
 * YYYY: 四位年份
 * YY: 两位年份
 * MM: 月份（01-12）
 * M: 月份（1-12）
 * DD: 日期（01-31）
 * D: 日期（1-31）
 * HH: 小时（00-23）
 * H: 小时（0-23）
 * hh: 小时（01-12）
 * h: 小时（1-12）
 * mm: 分钟（00-59）
 * m: 分钟（0-59）
 * ss: 秒（00-59）
 * s: 秒（0-59）
 * SS: 毫秒（00-99）
 * S: 毫秒（0-99）
 * A: 上午/下午
 * a: AM/PM
 * Z: 时区偏移（如 +0800）
 */
function formatDate(timestamp, format = "YYYY-MM-DD HH:mm:ss", timezone) {
  // 处理输入类型
  let date;
  if (timestamp instanceof Date) {
    date = timestamp;
  } else if (typeof timestamp === "number") {
    date = new Date(timestamp);
  } else if (typeof timestamp === "string") {
    // 尝试解析字符串为日期
    date = new Date(timestamp);
    if (isNaN(date.getTime())) {
      // 尝试解析可能的时间戳字符串
      const num = Number(timestamp);
      date = isNaN(num) ? new Date() : new Date(num);
    }
  } else {
    date = new Date();
  }

  // 处理时区
  if (timezone && typeof Intl !== "undefined") {
    try {
      const formatter = new Intl.DateTimeFormat("en-US", {
        year: "numeric",
        month: "2-digit",
        day: "2-digit",
        hour: "2-digit",
        minute: "2-digit",
        second: "2-digit",
        hour12: false,
        timeZone: timezone,
      });

      // 提取各部分时间
      const parts = formatter.formatToParts(date);
      const timeObj = {};
      parts.forEach((part) => {
        timeObj[part.type] = part.value;
      });

      // 构建带时区的日期
      const year = timeObj.year;
      const month = timeObj.month;
      const day = timeObj.day;
      const hour = timeObj.hour;
      const minute = timeObj.minute;
      const second = timeObj.second;

      date = new Date(`${year}-${month}-${day}T${hour}:${minute}:${second}Z`);
    } catch (e) {
      console.warn("Timezone conversion error:", e);
      // 时区转换失败，使用原日期
    }
  }

  // 格式化函数
  const formatters = {
    // 年份
    YYYY: date.getFullYear(),
    YY: String(date.getFullYear()).slice(2),

    // 月份
    MM: String(date.getMonth() + 1).padStart(2, "0"),
    M: date.getMonth() + 1,

    // 日期
    DD: String(date.getDate()).padStart(2, "0"),
    D: date.getDate(),

    // 小时
    HH: String(date.getHours()).padStart(2, "0"),
    H: date.getHours(),
    hh: String(date.getHours() % 12 || 12).padStart(2, "0"),
    h: date.getHours() % 12 || 12,

    // 分钟
    mm: String(date.getMinutes()).padStart(2, "0"),
    m: date.getMinutes(),

    // 秒
    ss: String(date.getSeconds()).padStart(2, "0"),
    s: date.getSeconds(),

    // 毫秒
    SS: String(date.getMilliseconds()).padStart(2, "0"),
    S: date.getMilliseconds(),

    // 上午/下午
    A: date.getHours() < 12 ? "上午" : "下午",
    a: date.getHours() < 12 ? "AM" : "PM",

    // 时区
    Z: () => {
      const offset = date.getTimezoneOffset();
      const sign = offset > 0 ? "-" : "+";
      const hours = Math.floor(Math.abs(offset) / 60);
      const minutes = Math.abs(offset) % 60;
      return `${sign}${String(hours).padStart(2, "0")}${String(
        minutes
      ).padStart(2, "0")}`;
    },
  };

  // 替换格式字符串中的占位符
  return format.replace(
    /YYYY|YY|MM|M|DD|D|HH|H|hh|h|mm|m|ss|s|SS|S|A|a|Z/g,
    (match) => {
      if (typeof formatters[match] === "function") {
        return formatters[match]();
      }
      return formatters[match];
    }
  );
}

/**
 * 兼容 iOS 的日期解析函数
 * @param {string} dateStr - 日期字符串（支持 "YYYY-MM-DD"、"YYYY-MM-DD HH:mm:ss" 等格式）
 * @example
 * parseDateSafely("2023-06-10") // 2023-06-10T00:00:00.000Z
 * parseDateSafely('2023-06-10') // 2023-06-10T00:00:00.000Z
 * parseDateSafely('2023-06-10 12:30:00') // 2023-06-10T12:30:00.000Z
 * @returns {Date} - 解析后的 Date 对象
 */
function parseDateSafely(dateStr) {
  // 检查是否为 ISO 格式（包含 T 和 Z）
  if (dateStr.includes("T") && dateStr.includes("Z")) {
    return new Date(dateStr);
  }

  // 尝试替换空格为 T 并添加 Z（转为 UTC 时间）
  const isoStr = dateStr.replace(" ", "T") + "Z";
  const date = new Date(isoStr);

  // 验证解析结果是否有效
  if (!isNaN(date.getTime())) {
    return date;
  }

  // 兜底：手动解析（适用于 "YYYY-MM-DD" 格式）
  const [year, month, day] = dateStr.split(/[-/]/).map(Number);
  return new Date(year, month - 1, day);
}

export { formatCountDown, formatDate, parseDateSafely };
